package bean;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;

import model.AcessoUsuario;
import model.Associado;
import business.AcessoUsuarioDAO;
import business.AssociadoDAO;

@ManagedBean(name = "contextoBean")
@SessionScoped
public class ContextoBean {

	private AcessoUsuario	usuarioLogado	= null;
	private Associado		associadoAtivo	= null;
	private Locale			localizacao		= null;
	private List<Locale>	idiomas;

	public AcessoUsuario getUsuarioLogado() {
		FacesContext context = FacesContext.getCurrentInstance();
		ExternalContext external = context.getExternalContext();
		String login = external.getRemoteUser();

		if (this.usuarioLogado == null || !login.equals(this.usuarioLogado.getLogin())) {

			if (login != null) {
				AcessoUsuarioDAO usuarioDAO = AcessoUsuarioDAO.getInstance();
				this.usuarioLogado = usuarioDAO.get(login);
				this.associadoAtivo = null;

//				String[] info = this.usuarioLogado.getIdioma().split("_");
//				Locale locale = new Locale(info[0], info[1]);
//				context.getViewRoot().setLocale(locale);
			}
		}
		return usuarioLogado;
	}

	public Associado getAssociadoAtivo() {
		if (this.associadoAtivo == null) {
			AcessoUsuario usuario = this.getUsuarioLogado();

			AssociadoDAO associadoDAO = AssociadoDAO.getInstance();
			this.associadoAtivo = associadoDAO.get(usuario.getId());

			if (this.associadoAtivo == null) {
				this.associadoAtivo =  associadoDAO.get(usuario.getIdCadastro());
			}
		}
		return this.associadoAtivo;
	}

	public void setAssociadoAtivo(ValueChangeEvent event) {

		Integer associado = (Integer) event.getNewValue();

		AssociadoDAO associadoDAO = new AssociadoDAO();
		this.associadoAtivo = associadoDAO.get(associado);
	}

	public Locale getLocaleUsuario() {
		if (this.localizacao == null) {
			AcessoUsuario usuario = this.getUsuarioLogado();
//			String idioma = usuario.getIdioma();
//			String[] info = idioma.split("_");
//			this.localizacao = new Locale(info[0], info[1]);
		}
		return this.localizacao;
	}

	public List<Locale> getIdiomas() {
		FacesContext context = FacesContext.getCurrentInstance();
		Iterator<Locale> locales = context.getApplication().getSupportedLocales();
		this.idiomas = new ArrayList<Locale>();
		while (locales.hasNext()) {
			this.idiomas.add(locales.next());
		}
		return idiomas;
	}

	public void setIdiomaUsuario(String idioma) {
		AcessoUsuarioDAO usuarioDAO = AcessoUsuarioDAO.getInstance();
		this.usuarioLogado = usuarioDAO.get(this.getUsuarioLogado().getLogin());
//		this.usuarioLogado.setIdioma(idioma);
//		usuarioDAO.salvar(this.usuarioLogado);

		String[] info = idioma.split("_");
		Locale locale = new Locale(info[0], info[1]);

		FacesContext context = FacesContext.getCurrentInstance();
		context.getViewRoot().setLocale(locale);
	}

	public void setUsuarioLogado(AcessoUsuario usuario) {
		this.usuarioLogado = usuario;
	}
}
